
`include "../define.sv"
//该版本为最初版的pe单元，没有浮点数处理单元
module pe_simple (
    input clk,
    input reset,
    input [`DATA_WIDTH-1:0] a_in,  // 输入A的数据
    input [`DATA_WIDTH-1:0] b_in,  // 输入B的数据
    input [`DATA_WIDTH-1:0] c_in,  // 输入C的数据
    input c_add_en,                // C矩阵加法使能信号
    output reg [`DATA_WIDTH-1:0] a_out, // 向右传递A数据
    output reg [`DATA_WIDTH-1:0] b_out, // 向下传递B数据
    output reg [`DATA_WIDTH-1:0] c_out // 累加结果
);

reg [`DATA_WIDTH-1:0] sum;
reg [`DATA_WIDTH-1:0] a_reg;
reg [`DATA_WIDTH-1:0] b_reg;
reg c_add_flag;

always @(posedge clk) begin
    if (reset) begin
        sum   <= {`DATA_WIDTH{1'b0}};
        a_out <= {`DATA_WIDTH{1'b0}};
        b_out <= {`DATA_WIDTH{1'b0}};
        a_reg <= {`DATA_WIDTH{1'b0}};
        b_reg <= {`DATA_WIDTH{1'b0}};
        c_out <= {`DATA_WIDTH{1'b0}};
    end else begin
        a_reg <= a_in;
        b_reg <= b_in;
        if (c_add_en && !c_add_flag) begin
            sum <= sum + c_in;
            c_add_flag <= 1; // 已经添加C矩阵
        end else begin
            sum   <= sum + (a_in * b_in); // 乘积累加
        end
        a_out <= a_reg;               // 向右传递
        b_out <= b_reg;               // 向下传递
        c_out <= sum;                 // 输出累加结果
    end
end

endmodule
